防御缓存穿透攻击的方法哪些
防御缓存穿透攻击的方法有以下这些:
如果后端数据源不存在数据,则在缓存中缓存一个空值:这种方案局限性很大,通常用来应对正常业务请求,而不能防御外部攻击。因为只要攻击者构造的攻击请求是不重复的,那么这个缓存就不会起到作用。
借助布隆过滤器:布隆过滤器由一个长度为m的位数组(bit array)与k个哈希函数组成的数据结构。当一个元素加入集”~“合时,通过k个哈希函数将这个元素映射成这个位数组中的k个位置,把它们置为1。检索时,我们只要看这些位置是不是都是1,如果都是1,则可以大致认为这个元素存在(有一定的错误率),如果这些位置中至少有一个0,那么这个元素一定不存在。所以,通过布隆过滤器检测不存在的元素,就不需要到下层数据源进行查询了,如此就解决了缓存穿透攻击问题。
对参数格式做过滤:攻击者需要构造请求来请求系统中不存在的数据来执行攻击,最直接的防御思路就是我们能不能对参数格式做些过滤,密码学可以很方便地达到这个效果,可以使用MAC消息认证码,平时使用多以HMAC为主进行,也可以使用对称加密方式进行过滤一般使用AC为主,也可以使用AEAD对称加密或者非对称加密方式来实现过滤。使用此方案可以把弥补布隆过滤器的缺点。但同时也存在着一些缺点对于已经生成的URL,如果原始数据被删除,那么这个URL的请求会被放过去。
增加时间随机值:可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
使用互斥锁:业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。